package br.uniceub.fsw.agenda.model.facade;

import br.uniceub.fsw.agenda.exception.BusinessException;
import br.uniceub.fsw.agenda.exception.DatabaseException;
import br.uniceub.fsw.agenda.model.dao.BairroDAO;
import br.uniceub.fsw.agenda.model.dao.CidadeDAO;
import br.uniceub.fsw.agenda.model.dao.MenuDAO;
import br.uniceub.fsw.agenda.model.dao.UFDAO;
import br.uniceub.fsw.agenda.model.vo.BairroVO;
import br.uniceub.fsw.agenda.model.vo.CidadeVO;
import br.uniceub.fsw.agenda.model.vo.MenuVO;
import br.uniceub.fsw.agenda.model.vo.UFVO;
import br.uniceub.fsw.agenda.util.StringUtils;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Bruno Schifer
 */
public class ManterBairroFacade extends GenericFacade {

    /**
     * Busca todos os itens do menu
     * @return listaa com objetos Menu
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<MenuVO> findAllMenu() throws DatabaseException, BusinessException {
        try {
            MenuDAO dao = new MenuDAO(getConnection());
            return dao.findAll();
        } finally {
            closeConnection();
        }
    }

    /**
     * Busca todas as ufs
     * @return listaa com objetos UF
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<UFVO> findAllUF() throws DatabaseException, BusinessException {
        try {
            UFDAO dao = new UFDAO(getConnection());
            return dao.findAll();
        } finally {
            closeConnection();
        }
    }

    /**
     * Busca todas as cidades
     * @return listaa com objetos Cidade
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<CidadeVO> findAllCidade() throws DatabaseException, BusinessException {
        try {
            CidadeDAO dao = new CidadeDAO(getConnection());
            return dao.findAll();
        } finally {
            closeConnection();
        }
    }

    public List<CidadeVO> findAllCidade(String sgUf) throws DatabaseException, BusinessException {
        try {
            CidadeDAO dao = new CidadeDAO(getConnection());
            
            if(StringUtils.isNullOrEmpty(sgUf)) {
                return dao.findAllByUF(sgUf);
            }
            else {
                return dao.findAll();
            }
        } finally {
            closeConnection();
        }
    }
    /**
     * Busca todas as Cidades
     * @param sgUf
     * @return lista com objetos Cidade
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<CidadeVO> findAllCidadeByUF(String sgUf) throws DatabaseException, BusinessException {
        try {
            CidadeDAO dao = new CidadeDAO(getConnection());
            return dao.findAllByUF(sgUf);
        } finally {
            closeConnection();
        }
    }

    /**
     * Busca uma Cidade
     * @param idCidade
     * @return lista com objetos Cidade
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public CidadeVO findCidadeById(Integer idCidade) throws DatabaseException, BusinessException {
        try {
            CidadeDAO dao = new CidadeDAO(getConnection());
            return dao.findById(idCidade);
        } finally {
            closeConnection();
        }
    }

    /**
     * Busca todos os Bairros
     * @return lista com objetos Bairro
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<BairroVO> findAllBairro() throws DatabaseException, BusinessException {
        try {
            BairroDAO dao = new BairroDAO(getConnection());
            return dao.findAll();
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Busca todos os Bairros
     * pelo nome, por cidade ou traz todos se os parâmetros forem nulos
     * @param noBairro nome do bairro
     * @param idCidade id da cidade
     * @return lista com objetos Bairro
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<BairroVO> findAllBairro(Integer idBairro, String noBairro, Integer idCidade) throws DatabaseException, BusinessException {
        try {
            BairroDAO dao = new BairroDAO(getConnection());
            
            if(idBairro != null) {
                List<BairroVO> listaBairro = new ArrayList<BairroVO>();
                BairroVO bairro = dao.findById(idBairro);
                
                if(bairro.getIdBairro() == null) {
                    throw new BusinessException("Nenhum registro encontrado.");
                }
                
                listaBairro.add(bairro);
                
                return listaBairro;
            }
            
            if(StringUtils.isNullOrEmpty(noBairro) && idCidade == null) { // Busca lista de Bairro
                return dao.findAll();
            } else if(StringUtils.isNullOrEmpty(noBairro) && idCidade != null) { // Busca lista de Bairro por Cidade
                return dao.findAllByCidade(idCidade);
            } else if(!StringUtils.isNullOrEmpty(noBairro) && idCidade == null) { // Busca lista de Bairro pelo nome
                return dao.findAllByNome(noBairro);
            } else { // Busca lista de Bairro por Cidade e por parte do nome
                return dao.findAllByNomeAndCidade(noBairro, idCidade);
            }
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Busca todos os Bairros por cidade ou traz todos se o parâmetro for nulo
     * @param idCidade id da cidade
     * @return lista com objetos Bairro
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<BairroVO> findAllBairro(Integer idCidade) throws DatabaseException, BusinessException {
        try {
            BairroDAO dao = new BairroDAO(getConnection());
            return dao.findAllByCidade(idCidade);
        } finally {
            closeConnection();
        }
    }

    /**
     * Busca a Bairro pela id
     * @param idBairro id do Bairro
     * @return objeto Bairro
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public BairroVO findBairroById(Integer idBairro) throws DatabaseException, BusinessException {
        try {
            BairroDAO dao = new BairroDAO(getConnection());
            return dao.findById(idBairro);
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Busca todas as Bairros por parte do nome
     * @param noBairro nome do bairro
     * @return lista com objetos Bairro
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<BairroVO> findAllBairroByNome(String noBairro) throws DatabaseException, BusinessException {
        try {
            BairroDAO dao = new BairroDAO(getConnection());
            return dao.findAllByNome(noBairro);
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Busca todos os Bairros por cidade
     * @param idCidade sigla da Cidade
     * @return lista com objetos Bairro
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<BairroVO> findAllBairroByCidade(Integer idCidade) throws DatabaseException, BusinessException {
        try {
            BairroDAO dao = new BairroDAO(getConnection());
            return dao.findAllByCidade(idCidade);
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Busca todos os Bairros pelo nome e por uf
     * @param noBairro nome da bairro
     * @param idCidade sigla da Cidade
     * @return lista com objetos Bairro
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<BairroVO> findAllBairroByNomeAndCidade(String noBairro, Integer idCidade) throws DatabaseException, BusinessException {
        try {
            BairroDAO dao = new BairroDAO(getConnection());
            return dao.findAllByNomeAndCidade(noBairro, idCidade);
        } finally {
            closeConnection();
        }
    }

    /**
     * Insere um novo bairro.
     * @param bairro objeto bairro
     * @return id auto-increment gerado pra esse registro
     * @throws br.uniceub.fsw.agenda.exception.BusinessException 
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     */
    public Integer inserirBairro(BairroVO bairro) throws BusinessException, DatabaseException {
        try {
            BairroDAO dao = new BairroDAO(getConnection());
            
            Integer idCidade = bairro.getCidade().getIdCidade();
            String noBairro = bairro.getNoBairro();
            
            //tratamento de erros
            if(idCidade == null) {
                throw new BusinessException("Cidade é obrigatória.");
            }
            if(StringUtils.isNullOrEmpty(noBairro)) {
                throw new BusinessException("Nome do Bairro é obrigatório.");
            }
        
            return dao.insert(bairro);
        } finally {
            closeConnection();
        }        
    }
    
    /**
     * Altera um bairro.
     * @param bairro objeto bairro
     * @throws br.uniceub.fsw.agenda.exception.BusinessException 
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     */
    public void alterarBairro(BairroVO bairro) throws BusinessException, DatabaseException {
        try {
            BairroDAO dao = new BairroDAO(getConnection());

            Integer idCidade = bairro.getCidade().getIdCidade();
            String noBairro = bairro.getNoBairro();
            
            //tratamento de erros
            if(idCidade == null) {
                throw new BusinessException("Cidade é obrigatória.");
            }
            if(StringUtils.isNullOrEmpty(noBairro)) {
                throw new BusinessException("Nome do Bairro é obrigatório.");
            }
        
            dao.update(bairro);            
        } finally {
            closeConnection();
        }        
    }
    
    /**
     * Exclui um bairro.
     * @param bairro objeto bairro
     * @throws br.uniceub.fsw.agenda.exception.BusinessException 
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     */
    public void excluirBairro(BairroVO bairro) throws BusinessException, DatabaseException {
        try {
            BairroDAO dao = new BairroDAO(getConnection());
            dao.delete(bairro);
        } finally {
            closeConnection();
        }        
    }

}
